package com.example.ad.sdk.domain.ad

import com.example.ad.sdk.domain.models.AdType

/**
 * 广告位类
 *
 * 用于表示一个具体的广告位，包含广告类型和渠道信息。
 * 使用Builder模式构建实例，确保对象创建过程的灵活性。
 */
class AdSlot {

    /** 广告类型 */
    val adType: AdType
    
    /** 渠道信息 */
    val channel: String

    /**
     * 私有构造函数
     *
     * 只能通过内部的Builder类来创建AdSlot实例。
     *
     * @param adModel 广告位模型对象，包含初始化所需的数据
     */
    private constructor(adModel: AdSlotModel){
        this.channel = adModel.channel
        this.adType = adModel.adType
    }

    /**
     * AdSlot的Builder类
     *
     * 使用Builder模式来逐步构建AdSlot对象。
     * 提供链式调用方式设置广告位的各项属性。
     */
    object Builder{

        /** 内部使用的广告位模型，用于暂存构建过程中的数据 */
        private val adModel = AdSlotModel()

        /**
         * 设置广告位渠道
         *
         * @param channel 渠道标识字符串
         * @return Builder实例，支持链式调用
         */
        fun setChannel(channel: String): Builder{
            adModel.channel = channel
            return this
        }

        /**
         * 设置广告类型
         *
         * @param adType 广告类型枚举值
         * @return Builder实例，支持链式调用
         */
        fun setAdType(adType: AdType): Builder{
            adModel.adType = adType
            return this
        }

        /**
         * 构建AdSlot实例
         *
         * 将Builder中设置的属性构建成一个不可变的AdSlot对象。
         *
         * @return 配置完成的AdSlot实例
         */
        fun build(): AdSlot{
            return AdSlot(adModel)
        }
    }
}

/**
 * 广告位模型数据类
 *
 * 用于在AdSlot构建过程中临时存储广告位的相关信息。
 *
 * @property channel 渠道信息，默认为空字符串
 * @property adType 广告类型，默认为激励视频广告
 */
data class AdSlotModel(var channel: String = "", var adType: AdType = AdType.TYPE_REWARD_VIDEO)